{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6aafbd33-16da-402c-b29f-8b2804739fe8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: scikit-learn in d:\\anaconda\\envs\\ssj\\lib\\site-packages (1.5.1)\n",
      "Requirement already satisfied: numpy>=1.19.5 in d:\\anaconda\\envs\\ssj\\lib\\site-packages (from scikit-learn) (1.26.4)\n",
      "Requirement already satisfied: scipy>=1.6.0 in d:\\anaconda\\envs\\ssj\\lib\\site-packages (from scikit-learn) (1.13.1)\n",
      "Requirement already satisfied: joblib>=1.2.0 in d:\\anaconda\\envs\\ssj\\lib\\site-packages (from scikit-learn) (1.4.2)\n",
      "Requirement already satisfied: threadpoolctl>=3.1.0 in d:\\anaconda\\envs\\ssj\\lib\\site-packages (from scikit-learn) (3.5.0)\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "pip install scikit-learn\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1f48722a-ec91-4537-acc4-de9a498f5cff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>species</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.1</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "0                5.1               3.5                1.4               0.2   \n",
       "1                4.9               3.0                1.4               0.2   \n",
       "2                4.7               3.2                1.3               0.2   \n",
       "3                4.6               3.1                1.5               0.2   \n",
       "4                5.0               3.6                1.4               0.2   \n",
       "\n",
       "  species  \n",
       "0  setosa  \n",
       "1  setosa  \n",
       "2  setosa  \n",
       "3  setosa  \n",
       "4  setosa  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import datasets\n",
    "\n",
    "# 加载鸢尾花数据集\n",
    "iris = datasets.load_iris()\n",
    "\n",
    "# 将数据集转换为 pandas DataFrame\n",
    "import pandas as pd\n",
    "df = pd.DataFrame(data=iris.data, columns=iris.feature_names)\n",
    "df['species'] = iris.target_names[iris.target]\n",
    "\n",
    "# 查看数据\n",
    "df.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "11bdada4-1785-4375-8cd7-03096ead2445",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入必要的库\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn import datasets\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ccd03855-ee38-48c8-b72d-305b385fb2a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加载鸢尾花数据集\n",
    "iris = datasets.load_iris()\n",
    "\n",
    "# 创建DataFrame\n",
    "df = pd.DataFrame(data=iris.data, columns=iris.feature_names)\n",
    "df['species'] = iris.target_names[iris.target]\n",
    "\n",
    "# 查看数据\n",
    "df.head()\n",
    "\n",
    "# 分割数据集为特征（X）和目标（y）\n",
    "X = df.drop(columns=['species'])\n",
    "y = df['species']\n",
    "\n",
    "# 将数据分为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 标准化特征数据\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_test_scaled = scaler.transform(X_test)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1967e9eb-c280-473b-802e-ab88a0fe34e9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "KNN模型准确率:  1.0\n",
      "[[10  0  0]\n",
      " [ 0  9  0]\n",
      " [ 0  0 11]]\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "      setosa       1.00      1.00      1.00        10\n",
      "  versicolor       1.00      1.00      1.00         9\n",
      "   virginica       1.00      1.00      1.00        11\n",
      "\n",
      "    accuracy                           1.00        30\n",
      "   macro avg       1.00      1.00      1.00        30\n",
      "weighted avg       1.00      1.00      1.00        30\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# KNN模型\n",
    "knn = KNeighborsClassifier(n_neighbors=5)\n",
    "knn.fit(X_train_scaled, y_train)\n",
    "\n",
    "# 在测试集上进行预测\n",
    "y_pred_knn = knn.predict(X_test_scaled)\n",
    "\n",
    "# 打印KNN模型的评估结果\n",
    "print(\"KNN模型准确率: \", accuracy_score(y_test, y_pred_knn))\n",
    "print(confusion_matrix(y_test, y_pred_knn))\n",
    "print(classification_report(y_test, y_pred_knn))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c3020ac9-6afb-4da6-8528-c2b82b84358c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "决策树模型准确率:  1.0\n",
      "[[10  0  0]\n",
      " [ 0  9  0]\n",
      " [ 0  0 11]]\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "      setosa       1.00      1.00      1.00        10\n",
      "  versicolor       1.00      1.00      1.00         9\n",
      "   virginica       1.00      1.00      1.00        11\n",
      "\n",
      "    accuracy                           1.00        30\n",
      "   macro avg       1.00      1.00      1.00        30\n",
      "weighted avg       1.00      1.00      1.00        30\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 决策树模型\n",
    "dt = DecisionTreeClassifier(random_state=42)\n",
    "dt.fit(X_train_scaled, y_train)\n",
    "\n",
    "# 在测试集上进行预测\n",
    "y_pred_dt = dt.predict(X_test_scaled)\n",
    "\n",
    "# 打印决策树模型的评估结果\n",
    "print(\"决策树模型准确率: \", accuracy_score(y_test, y_pred_dt))\n",
    "print(confusion_matrix(y_test, y_pred_dt))\n",
    "print(classification_report(y_test, y_pred_dt))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0427a126-34ed-4405-ba0e-6caf01462810",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "随机森林模型准确率:  1.0\n",
      "[[10  0  0]\n",
      " [ 0  9  0]\n",
      " [ 0  0 11]]\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "      setosa       1.00      1.00      1.00        10\n",
      "  versicolor       1.00      1.00      1.00         9\n",
      "   virginica       1.00      1.00      1.00        11\n",
      "\n",
      "    accuracy                           1.00        30\n",
      "   macro avg       1.00      1.00      1.00        30\n",
      "weighted avg       1.00      1.00      1.00        30\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# 随机森林模型\n",
    "rf = RandomForestClassifier(random_state=42)\n",
    "rf.fit(X_train_scaled, y_train)\n",
    "\n",
    "# 在测试集上进行预测\n",
    "y_pred_rf = rf.predict(X_test_scaled)\n",
    "\n",
    "# 打印随机森林模型的评估结果\n",
    "print(\"随机森林模型准确率: \", accuracy_score(y_test, y_pred_rf))\n",
    "print(confusion_matrix(y_test, y_pred_rf))\n",
    "print(classification_report(y_test, y_pred_rf))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "eee539d7-01dc-4b15-869e-6944bab510fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABZMAAAIOCAYAAADN1ZPjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABh90lEQVR4nO3deZxVdf0/8PdlGxYBAWVTEdxxx61wxwXFJc3cUyG0XDMlFUlzK0Wxb1K5lLlrGlqIqLlQbvlVC3fNslzJAhFTVEQUOL8/+s18HWaYOzPOcM/h83z6uI+Hc+65537uPdzzuvfzeZ/PKWVZlgUAAAAAADSgTaUbAAAAAABA/ulMBgAAAACgLJ3JAAAAAACUpTMZAAAAAICydCYDAAAAAFCWzmQAAAAAAMrSmQwAAAAAQFk6kwEAAAAAKEtnMgAAAAAAZelMLpjrrrsuSqVSPPnkk7WWz5kzJ7bYYotYYYUVYtq0aRERcc4550SpVIrevXvHhx9+WGdbAwcOjL322qvWslKpFKVSKS688MJGP/fSvPbaa3HCCSfEOuusE506dYrOnTvHBhtsEGeeeWb861//auxLbpY33ngj9txzz+jZs2eUSqU46aSTWvw5Bg4cGKNGjWrx7Zbz0EMP1eyn6667rt51dtpppyiVSjFw4MBmPcfNN98cEydObNJj3njjjQbbBNBaqvOp+taxY8fo27dvDBs2LMaPHx+zZ89u1edv7vFv1KhRzT5ON9eoUaNqvVdLu1Ui35b0wQcfxPnnnx9bbLFFdOvWLaqqqmLgwIExevToePrpp1v1uT/99NM45phjol+/ftG2bdvYdNNNW/w5KrH/q5Xbz+edd17NOm+88UaTt//YY4/FOeecE++//36THlep71ZAy1kyk9u1axf9+vWLgw8+OP7xj39UrF3Vv43z4vO/6Za87b///pVuXr0uv/zyJn/XWbBgQVx66aWx7bbbRo8ePaJDhw6xyiqrxIEHHhgPP/xw6zT0c84888wYMGBAtGvXLlZcccUW334l/10NHDgwSqVS7LjjjvXef8MNN9T8m3rooYeavP2XXnopzjnnnCZ/D9hxxx2X2iaWH+0q3QC+uLfeeit23XXXePvtt+P3v/99fPnLX651/zvvvBMTJkyIH/zgB43e5oUXXhjf+ta3omfPns1q01133RUHH3xwrLTSSnHCCSfEkCFDolQqxQsvvBDXXHNN3H333fHMM880a9uNcfLJJ8ef/vSnuOaaa6Jv377Rr1+/Fn+O22+/Pbp169bi222srl27xtVXX13nR9frr78eDz300Bdq28033xwvvvhikzrh+/XrF48//nisueaazX5egC/i2muvjfXWWy8+++yzmD17djz66KNx0UUXxY9+9KOYNGlS7LLLLq3yvM09/n3/+9+P73znO63Spoae85hjjqn5++mnn47jjz8+Lrjgghg2bFjN8pVXXnmZtmtJr776agwfPjxmz54dxxxzTJx77rmxwgorxBtvvBG33nprbL755vH+++9H9+7dW+X5r7jiivjFL34RP/vZz2LzzTePFVZYocWfoxL7//O6du0at912W/zsZz+Lrl271izPsiyuu+666NatW3zwwQfN2vZjjz0W5557bowaNapJP94r/d0KaDnVmfzJJ5/E//7v/8b5558fDz74YPztb3+LHj16VLp5ubFk/kZE9OrVq0Ktadjll18eK620UqMH/ebMmRO77757PP/88zF69Og49dRTo2fPnvGvf/0r7rjjjth5553jqaeeik022aRV2nvHHXfE+eefH2eccUaMGDEiqqqqWvw5jjrqqNh9991bfLuN1bVr13jkkUfi1VdfrfM99JprrvlCWf7SSy/FueeeGzvuuGOTBr8vv/zyZj0fxaIzueD+8Y9/xC677BKfffZZPPzww7HRRhvVWWf33XePSy65JI4//vjo27dv2W3usssu8dBDD8X5558f//M//9PkNr3++utx8MEHxzrrrBMPPvhgrR96O+20U5x44olx++23N3m7TfHiiy/GVlttFfvuu2+rPceQIUNabduNcdBBB8VVV10V//jHP2LttdeuWX7NNdfEKqusEhtttFG89NJLrd6ORYsWxcKFC6OqqqrOQAbAsrThhhvGFltsUfP31772tTj55JNj2223jf322y/+8Y9/RJ8+fVr8eZt7/KvE4Nuaa65Z63k/+eSTiIhYe+21G3wN8+fPj44dOy6T6ptFixbFV7/61ZgzZ048/vjjseGGG9bct8MOO8TIkSPjnnvuifbt27daG1588cXo1KlTnHDCCa32HJUefN1nn33it7/9bfz617+Ob37zmzXLH3jggXj99dfjm9/8Zvzyl79cJm2ZP39+dOrUqeLfrYCW8/lM3nHHHWPRokVx9tlnx5QpU+Ib3/hGhVuXH+Xyt7mWZW4vzRFHHBHPPfdc3HfffbHTTjvVuu/ggw+OMWPGtOrAwosvvhgRESeeeGL07t27VZ5j1VVXjVVXXbVVtt0Y2267bU3B3vnnn1+z/NVXX41HHnkkjjrqqGWW5R9//HF07tw51l9//WXyfFSWaS4K7Nlnn41tt9022rVrF48++mi9HckRET/84Q9j4cKFcc455zRqu+uuu24ceeSRcdlll8Wbb77Z5Hb9+Mc/jnnz5sXll19eb8VQqVSK/fbbr9aya665JjbZZJPo2LFj9OzZM7761a/GX//611rrjBo1KlZYYYV45ZVXYo899ogVVlghVltttfjud78bCxYsiIj/O13olVdeiXvuuafWKZrVp1wteZpG9WM+f+rHM888E3vttVf07t07qqqqon///rHnnnvGW2+9VbNOfadizpgxIw477LCaxw0ePDj+53/+JxYvXlyzTvXp0D/60Y/ixz/+cQwaNChWWGGFGDp0aDzxxBONfp933XXXWG211eKaa66pWbZ48eK4/vrrY+TIkdGmTd2P92WXXRbbb7999O7dO7p06RIbbbRRTJgwIT777LOadXbccce4++67480336x1utXn2z5hwoT44Q9/GIMGDYqqqqp48MEH65zm/cknn8SQIUNirbXWirlz59Zsf9asWdG3b9+aL5UArWnAgAHxP//zP/Hhhx/GL37xi1r3Pfnkk/GVr3wlevbsGR07dowhQ4bErbfeWmcb//rXv+Jb3/pWrLbaatGhQ4fo379/7L///vH2229HRP3TXLzzzjs1j6mqqoqVV145ttlmm/j9739fs0590xx88sknMW7cuBg0aFDNqaDHH398nekCqqequvfee2OzzTaLTp06xXrrrVcrE5qrOi/vv//+GD16dKy88srRuXPnmqydNGlSDB06NLp06RIrrLBC7LbbbvWebdTY93dJU6ZMiRdeeCHGjRtXqyP580aMGBGdO3eu+fvRRx+NnXfeObp27RqdO3eOrbfeOu6+++56X9eDDz4Yxx57bKy00krRq1ev2G+//eLf//53zXqlUimuuuqqmD9/fq1ppRqazqRUKtX6nlWE/d+9e/f46le/Wucx11xzTWyzzTaxzjrr1HnMtGnTYp999olVV101OnbsGGuttVYcffTRMWfOnJp1zjnnnDj11FMjImLQoEF1TrGtbvvkyZNjyJAh0bFjxzj33HNr7vv8d6tjjjkmOnbsGE899VTNssWLF8fOO+8cffr0iZkzZzb69QKVVd2xXJ2dEf895n33u9+NTTfdNLp37x49e/aMoUOHxh133FHn8aVSKU444YS48cYbY/DgwdG5c+fYZJNN4q677qqz7t133x2bbrppVFVVxaBBg+JHP/pRvW1q6jH3rrvuiiFDhkSnTp1i8ODBNc993XXXxeDBg6NLly6x1VZbNXpayMZoSr59kdx+7bXX4uCDD47+/ftHVVVV9OnTJ3beeed49tlna96Dv/zlL/Hwww/XHNcbqlZ96qmn4p577okjjzyyTkdytS233DIGDBhQ8/eLL74Y++yzT/To0SM6duwYm266aVx//fW1HlP92/2WW26JM844I/r37x/dunWLXXbZJV5++eWa9QYOHBhnnnlmRET06dOnVk4vmdmff8znM+jjjz+OU045JQYNGlTTT7HFFlvELbfcUrNOfdNcLF68OCZMmBDrrbdeVFVVRe/eveOII46o1ZcQ8d/f3RtuuGFMnz49tttuu+jcuXOsscYaceGFF9bqP2hImzZt4ogjjojrr7++1mOuueaaWG211eo9K+/JJ5+Mgw8+OAYOHBidOnWKgQMHxiGHHFKr7+e6666LAw44ICIihg0bVmeazeq2P/LII7H11ltH586dY/To0TX3fX6aiwsvvDDatGkTd955Z612jBo1Kjp37hwvvPBCo14r+aIzuaAeffTR2HHHHaN3797x6KOPxhprrLHUdVdfffU47rjj4uqrr46///3vjdr+OeecE23bto3vf//7TW7b/fffH3369Gn0COv48ePjyCOPjA022CAmT54cP/nJT+L555+PoUOH1plX67PPPouvfOUrsfPOO8cdd9wRo0ePjksuuSQuuuiiiIjYbLPN4vHHH4++ffvGNttsE48//ng8/vjjTZrmYt68eTXThlx22WUxbdq0mDhxYgwYMKDeuaervfPOO7H11lvH/fffHz/4wQ9i6tSpscsuu8Qpp5xSb2XT57f9q1/9KubNmxd77LFHrY7XhrRp0yZGjRoVN9xwQ02n7P333x9vvfXWUkf7X3311Tj00EPjxhtvjLvuuiuOPPLIuPjii+Poo4+uWefyyy+PbbbZJvr27Vvz/j3++OO1tvPTn/40HnjggfjRj34U99xzT6y33np1nqtjx45x6623xuzZs2uCZfHixfH1r389siyLW265Jdq2bduo1wrwReyxxx7Rtm3beOSRR2qWPfjgg7HNNtvE+++/Hz//+c/jjjvuiE033TQOOuigWp2F//rXv2LLLbeM22+/PcaMGRP33HNPTJw4Mbp37x7vvffeUp/z8MMPjylTpsRZZ50V999/f1x11VWxyy67xLvvvrvUx2RZFvvuu2/86Ec/isMPPzzuvvvuGDNmTFx//fWx00471fworPbcc8/Fd7/73Tj55JPjjjvuiI033jiOPPLIWq/zixg9enS0b98+brzxxvjNb34T7du3jwsuuCAOOeSQWH/99ePWW2+NG2+8MT788MPYbrvtap0N09j3tz73339/RESjzy56+OGHY6eddoq5c+fG1VdfHbfcckt07do19t5775g0aVKd9Y866qho37593HzzzTFhwoR46KGH4rDDDqu5//HHH4899tgjOnXqVJOBe+65Z6PaUq0o+//II4+MJ554omYA//3334/JkyfHkUceWe/6r776agwdOjSuuOKKuP/+++Oss86KP/3pT7HtttvWDEwfddRR8e1vfzsiIiZPnlzzHm622WY123n66afj1FNPjRNPPDHuvffe+NrXvlbv802cODEGDx4cBx54YE3nzrnnnhsPPfRQ3HTTTa0yjRnQOl5//fWIiFoDVQsWLIj//Oc/ccopp8SUKVPilltuqTmb6IYbbqizjbvvvjsuvfTSOO+88+K3v/1tTRHSa6+9VrPOH/7wh9hnn32ia9eu8etf/zouvvjiuPXWW+Paa6+tta3mHHPHjRsXY8eOjcmTJ0f37t1jv/32i7PPPjuuuuqquOCCC+JXv/pVzJ07N/baa6+YP39+o96XxYsXx8KFC2vdqjU1375Ibu+xxx7x1FNPxYQJE2LatGlxxRVXxJAhQ2qOvbfffnusscYaMWTIkJrjekNnGzc1y19++eXYeuut4y9/+Uv89Kc/jcmTJ8f6668fo0aNigkTJtRZ/3vf+168+eabcdVVV8WVV14Z//jHP2Lvvfeu+V18++2312TZvffeG48//ngcddRRjWpLtTFjxsQVV1xRk1U33nhjHHDAAQ1meUTEscceG2PHjo1dd901pk6dGj/4wQ/i3nvvja233rrW4GvEfwutvv71r8dhhx0WU6dOjREjRsS4cePipptuanQ7R48eHf/+97/jvvvui4j/nuF1/fXXx6hRo+otMHvjjTdi3XXXjYkTJ8Z9990XF110UcycOTO23HLLmvbtueeeccEFF0TEf/st6vs+NHPmzDjssMPi0EMPjd/97ndx3HHH1du+sWPHxogRI2LkyJE1HdbXXnttXH/99fGzn/1sqUWR5FxGoVx77bVZRGQRkXXv3j2bPXv2Utc9++yzs4jI3nnnnWzOnDlZ9+7ds6997Ws196+++urZnnvuWesxEZEdf/zxWZZl2RlnnJG1adMme+6552o99/Tp0xtsY8eOHbMvf/nLjXo97733XtapU6dsjz32qLV8xowZWVVVVXbooYfWLBs5cmQWEdmtt95aa9099tgjW3fddWstq++1Vbf/9ddfr7X8wQcfzCIie/DBB7Msy7Inn3wyi4hsypQpDbZ99dVXz0aOHFnz9+mnn55FRPanP/2p1nrHHntsViqVspdffjnLsix7/fXXs4jINtpoo2zhwoU16/35z3/OIiK75ZZbGnze6vbedttt2WuvvZaVSqXsrrvuyrIsyw444IBsxx13zLIsy/bcc89s9dVXX+p2Fi1alH322WfZDTfckLVt2zb7z3/+U3Pf0h5b3fY111wz+/TTT+u979prr621fNKkSVlEZBMnTszOOuusrE2bNtn999/f4GsEaIrG5FOfPn2ywYMH1/y93nrrZUOGDMk+++yzWuvttddeWb9+/bJFixZlWZZlo0ePztq3b5+99NJLS912fce/FVZYITvppJMabPfIkSNrHWvvvffeLCKyCRMm1Fqv+jh65ZVX1ixbffXVs44dO2ZvvvlmzbL58+dnPXv2zI4++ugGn/fzPp8p1arfzyOOOKLWujNmzMjatWuXffvb3661/MMPP8z69u2bHXjggTXLGvv+1mf33XfPIiL75JNPGvUavvzlL2e9e/fOPvzww5plCxcuzDbccMNs1VVXzRYvXlzrdR133HG1Hj9hwoQsIrKZM2fWLBs5cmTWpUuXWustLeey7L/fn84+++yav/O+/6u/7y1evDgbNGhQdsopp2RZlmWXXXZZtsIKK2QffvhhdvHFF9f7vana4sWLs88++yx78803s4jI7rjjjpr7Gnrs6quvnrVt27bme9GS933+u1WWZdk//vGPrFu3btm+++6b/f73v8/atGmTnXnmmWVfI1AZ1cfaJ554Ivvss8+yDz/8MLv33nuzvn37Zttvv32dXPi8hQsXZp999ll25JFHZkOGDKl1X0Rkffr0yT744IOaZbNmzcratGmTjR8/vmbZl770pax///7Z/Pnza5Z98MEHWc+ePbPPd3809ZjbqVOn7K233qpZ9uyzz2YRkfXr1y+bN29ezfIpU6ZkEZFNnTq1wfepOn/ru/3jH//Isqzp+dbc3J4zZ07N77WGbLDBBtkOO+zQ4DrVjjnmmCwisr/97W+NWv/ggw/OqqqqshkzZtRaPmLEiKxz587Z+++/n2XZ/71vS/Yf3HrrrVlEZI8//njNss/3h3zekpldbckM2nDDDbN99923wXZXP0e1v/71r/V+1/jTn/6URUT2ve99r2bZDjvsUG//wfrrr5/ttttuDT5vdXur+zx22GGHbP/998+yLMvuvvvurFQqZa+//np222231errqM/ChQuzjz76KOvSpUv2k5/8pGZ5Q4+tbvsf/vCHeu9b8t/JnDlzslVXXTXbaqutsqeffjrr3Llzdthhh5V9jeSXyuSC+spXvhJz586Nk046qVFTBfTq1SvGjh0bv/3tb+NPf/pTo57jtNNOi549e8bYsWO/aHOX6vHHH4/58+fXmS5itdVWi5122in+8Ic/1FpeKpVi7733rrVs4403btZ0HEuz1lprRY8ePWLs2LHx85//vNHzDj/wwAOx/vrrx1ZbbVVr+ahRoyLLsnjggQdqLd9zzz1rVeZuvPHGERFNei2DBg2KHXfcMa655pp49913a6q1l+aZZ56Jr3zlK9GrV69o27ZttG/fPo444ohYtGhRo6vWI/7776+xc1UeeOCBceyxx8app54aP/zhD+N73/te7Lrrro1+LoCWkGVZzf+/8sor8be//S2+/vWvR0TUqgbaY489YubMmTWnSt5zzz0xbNiwGDx4cJOeb6uttorrrrsufvjDH8YTTzxRazqhpanOiSUz8YADDoguXbrUycRNN9201umhHTt2jHXWWafFMnHJatH77rsvFi5cGEcccUSt96xjx46xww471Exj0JT394uaN29e/OlPf4r999+/1kXy2rZtG4cffni89dZbdZ7rK1/5Sq2/m5O/5RRl/5dKpRg1alTceOONsXDhwrj66qvjwAMPXOoFB6sviLjaaqtFu3bton379rH66qtHRNSZnqwhG2+8cb3TaNRnrbXWil/+8pcxZcqU2GuvvWK77bZr9NRtQOV8+ctfjvbt20fXrl1j9913jx49esQdd9wR7drVvmzTbbfdFttss02ssMIKNceVq6++ut5jyrBhw2pdMLRPnz7Ru3fvmuPevHnzYvr06bHffvtFx44da9arrub9vOYcc1dZZZWav6u/F+y44461pl2qXt7YY/FFF10U06dPr3VbbbXVmpVvzc3tnj17xpprrhkXX3xx/PjHP45nnnmm0dMstJQHHnggdt5551httdVqLR81alR8/PHHdc6UXVZZfs8998Tpp58eDz30UKOqzR988MGIqPvvaquttorBgwfX+XfVt2/fOv0HzenfGD16dEydOjXefffduPrqq2PYsGFLnYbko48+irFjx8Zaa60V7dq1i3bt2sUKK6wQ8+bNa1KW9+jRY6lTmCypV69eMWnSpHj66adj6623jgEDBsTPf/7zRj8X+aMzuaC+//3vx1lnnRU333xzHHbYYY3qUD7ppJOif//+cdpppzXqObp16xZnnnlm3HvvvTUHxcYYMGBAzWlM5VSfIlLfaYr9+/evcwpJ586da30xiPjvhY+qLyDUErp37x4PP/xwbLrppvG9730vNthgg+jfv3+cffbZDf4YfPfdd5f6Oqrv/7wlr9JbfXXZxp4SVe3II4+MO++8M3784x9Hp06dYv/99693vRkzZsR2220X//rXv+InP/lJ/PGPf4zp06fHZZdd1uTnbepppaNHj47PPvss2rVrFyeeeGKTHgvwRc2bNy/efffdmuNx9XyNp5xySrRv377WrfoUverT/N55551mXVhl0qRJMXLkyLjqqqti6NCh0bNnzzjiiCNi1qxZS33Mu+++G+3atYuVV1651vJSqRR9+/YtmyMR/82SpubI0ix5rK9+37bccss679ukSZNq3rOmvL/1qe4gbcx3iffeey+yLKtI/jakSPv/G9/4RrzzzjtxwQUXxNNPP73UKS4WL14cw4cPj8mTJ8dpp50Wf/jDH+LPf/5zzfUeWvN7xJ577hl9+vSJTz75JMaMGWOaLCiAG264IaZPnx4PPPBAHH300fHXv/41DjnkkFrrTJ48OQ488MBYZZVV4qabborHH388pk+fHqNHj67391254957770Xixcvrvei80sua+oxt2fPnrX+7tChQ4PLG/v7dI011ogtttii1q2qqqpZ+dbc3C6VSvGHP/whdtttt5gwYUJsttlmsfLKK8eJJ57Y4DSPDWlKlle/lrxl+U9/+tMYO3ZsTJkyJYYNGxY9e/aMfffdt85UnJ/X1P6Nlsry/fffPzp27BiXXHJJ3HnnnUvN8oiIQw89NC699NI46qij4r777os///nPMX369Fh55ZVbNcu/9KUvxQYbbBCffPJJHHvssdGlS5cmPZ58aVd+FfLq3HPPjVKpFOeee24sXrw4fvWrX9UZ6f28Tp06xTnnnBPf+ta36kzavzTHHnts/OQnP4mxY8fGscce26jH7LbbbvGzn/0snnjiibLzJlcfPOu7gMq///3vWGmllRr1nI1R3Qm95PxX9f2g3WijjeLXv/51ZFkWzz//fFx33XVx3nnnRadOneL000+vd/u9evVa6uuIiBZ9LZ+33377xfHHHx8XXnhhfPOb34xOnTrVu96UKVNi3rx5MXny5JoqooiouahCUzTlqsDz5s2Lww8/PNZZZ514++2346ijjqr3ohoAreXuu++ORYsW1VwMpPp4PG7cuDoXhK227rrrRkTEyiuvXOeCKY2x0korxcSJE2PixIkxY8aMmDp1apx++ukxe/bsuPfee+t9TK9evWLhwoXxzjvv1Ppxm2VZzJo1K7bccssmt+OLWPJYX/2+/eY3v6mVI0tqyvtbn9122y2uvPLKmDJlylIzt1qPHj2iTZs2yyR/l/Y9or65E4u0/6sv0HPuuefGuuuuG1tvvXW967344ovx3HPPxXXXXRcjR46sWf7KK680+Tmb8j0i4r8X4vvwww9jgw02iBNPPDG222676NGjR5OfF1h2Bg8eXHPRvWHDhsWiRYviqquuit/85jc1xS833XRTDBo0KCZNmlTruLDkcbaxevToEaVSqd6BuyWX5S1zl9ScfGtubkf89zpLV199dURE/P3vf49bb701zjnnnPj000+bVUG62267xfe+972YMmVK7L777mXXX5a/pauqqur9N7Zknnfp0iXOPffcOPfcc+Ptt9+uqVLee++9429/+1u92/58/8aSxQgt3b/xeZ07d46DDz44xo8fH926dVvq96+5c+fGXXfdFWeffXat71jV85c3RVOz/Oyzz44XXnghNt988zjrrLNir732avDaX+SbyuSCO+ecc+Lcc8+NW2+9NQ499NBaE/bXZ/To0TF48OA4/fTTG3XqSocOHeKHP/xhTJ8+PW677bZGtenkk0+OLl26xHHHHVfvxeSyLKuZrH/o0KHRqVOnOhPMv/XWWzWnurSU6tM8nn/++VrLp06dutTHlEql2GSTTeKSSy6JFVdcMZ5++umlrrvzzjvHSy+9VGedG264IUqlUgwbNqz5jW9Ap06d4qyzzoq99967wQ7/6oN99ahtxH/3xS9/+cs667ZkZdsxxxwTM2bMiMmTJ8fVV18dU6dOjUsuuaRFtg1QzowZM+KUU06J7t2711xsdN1114211147nnvuuTrVQNW36tNoR4wYEQ8++OAXmpZhwIABccIJJ8Suu+5aNkciok4m/va3v4158+a1aCY2x2677Rbt2rWLV199danvW0TT3t/67LPPPrHRRhvF+PHj48UXX6x3nfvuuy8+/vjj6NKlS3zpS1+KyZMn18qtxYsXx0033RSrrrpqo6dTKKdPnz7RsWPHOt8jyg2QFmH/f/e734299967wQsv1/c9IiLiF7/4RZ11W7JC7KqrroqbbropLr300pg6dWq8//77S73QMJBfEyZMiB49esRZZ51V8zu0VCpFhw4danVKzZo1q9mFJ126dImtttoqJk+eXKsy+MMPP4w777yz1rp5z9yWyLfG5vaS1llnnTjzzDNjo402qpVbTfmNuNlmm8WIESPi6quvrjPdY7Unn3wyZsyYERH/3R8PPPBATedxtRtuuCE6d+5ctkitKQYOHFgnyx944IH46KOPlvqYPn36xKhRo+KQQw6Jl19+OT7++ON616ue9mHJf1fTp0+Pv/71r6367+rYY4+NvffeO84666w6Z3NXK5VKkWVZnSy/6qqr6pzt3pJZPm3atBg/fnyceeaZMW3atOjevXscdNBB8emnn37hbVMZKpOXA2eddVa0adMmvv/970eWZXHLLbcstUK5bdu2ccEFF8RXv/rViPi/uYUacsghh8SPfvSjuOeeexrVnkGDBsWvf/3rOOigg2LTTTeNE044IYYMGRIRES+99FJcc801kWVZfPWrX40VV1wxvv/978f3vve9OOKII+KQQw6Jd999N84999zo2LFjnH322Y18F8rbcsstY911141TTjklFi5cGD169Ijbb789Hn300Vrr3XXXXXH55ZfHvvvuG2ussUZkWRaTJ0+O999/v8G5fk8++eS44YYbYs8994zzzjsvVl999bj77rvj8ssvj2OPPbbFfszWZ8yYMTFmzJgG19l1112jQ4cOccghh8Rpp50Wn3zySVxxxRXx3nvv1Vl3o402ismTJ8cVV1wRm2++ebRp02apXzYaUv0D8Nprr40NNtggNthggzjhhBNi7Nixsc0229SZHwrgi3jxxRdr5gOcPXt2/PGPf4xrr7022rZtG7fffnutyqNf/OIXMWLEiNhtt91i1KhRscoqq8R//vOf+Otf/xpPP/10zQDqeeedF/fcc09sv/328b3vfS822mijeP/99+Pee++NMWPGxHrrrVenHXPnzo1hw4bFoYceGuutt1507do1pk+fHvfee+9SK0Ui/nuc3m233WLs2LHxwQcfxDbbbBPPP/98nH322TFkyJA4/PDDW/5Na4KBAwfGeeedF2eccUa89tprNXNgvv322/HnP/+5poInovHvb32q99fw4cNj6NChceyxx8awYcOiS5cu8eabb8ZvfvObuPPOO2vya/z48bHrrrvGsGHD4pRTTokOHTrE5ZdfHi+++GLccsstTa6cWZpSqRSHHXZYXHPNNbHmmmvGJptsEn/+85/j5ptvrrVeEff/8OHDY/jw4Q2us95668Waa64Zp59+emRZFj179ow777wzpk2bVmfd6iuz/+QnP4mRI0dG+/btY911121wEKE+L7zwQpx44okxcuTImg7kq6++Ovbff/+YOHFinHTSSU3aHlA5PXr0iHHjxsVpp51WM1XjXnvtFZMnT47jjjsu9t9///jnP/8ZP/jBD6Jfv34NTiXQkB/84Aex++67x6677hrf/e53Y9GiRXHRRRdFly5dalVe5j1zI754vjU2t59//vk44YQT4oADDoi11147OnToEA888EA8//zztapXq8/enTRpUqyxxhrRsWPHmuN9fW644YbYfffdY8SIETF69OgYMWJE9OjRI2bOnBl33nln3HLLLfHUU0/FgAED4uyzz4677rorhg0bFmeddVb07NkzfvWrX8Xdd98dEyZMiO7du7fY+3r44YfXTBu6ww47xEsvvRSXXnppnef40pe+FHvttVdsvPHG0aNHj/jrX/8aN954YwwdOrTWPNmft+6668a3vvWt+NnPfhZt2rSJESNGxBtvvBHf//73Y7XVVouTTz65xV7HkjbddNOYMmVKg+t069Yttt9++7j44otjpZVWioEDB8bDDz8cV199day44oq11t1www0jIuLKK6+Mrl27RseOHWPQoEH1Ts3RkJkzZ8Zhhx0WO+ywQ5x99tnRpk2bmDRpUmy//fZx2mmnxcSJE5u0PXKiAhf94wto6Ir1559/fhYR2X777Zd9+umnS716aZZl2dZbb51FRM3VP6vF/7+695Luv//+mqvL1vfc9Xn11Vez4447LltrrbWyqqqqrFOnTtn666+fjRkzps7Vva+66qps4403zjp06JB1794922effbK//OUvtdap78rqWVb3CqpZVvvKpp/397//PRs+fHjWrVu3bOWVV86+/e1vZ3fffXetq5T+7W9/yw455JBszTXXzDp16pR1794922qrrbLrrruuznMsecXxN998Mzv00EOzXr16Ze3bt8/WXXfd7OKLL6511frqq8FffPHFddoXS7my7OdVX8H2tttua3C9Pffcs9ZV4rMsy+68885sk002yTp27Jitssoq2amnnprdc889da7S+p///Cfbf//9sxVXXDErlUo1729DbV/yKvfPP/981qlTpzrv0SeffJJtvvnm2cCBA7P33nuvwdcA0BjV2Vh969ChQ9a7d+9shx12yC644IJs9uzZ9T7uueeeyw488MCsd+/eWfv27bO+fftmO+20U/bzn/+81nr//Oc/s9GjR2d9+/bN2rdvn/Xv3z878MADs7fffjvLsrrHv08++SQ75phjso033jjr1q1b1qlTp2zdddfNzj777FpXfB85cmSd4/T8+fOzsWPHZquvvnrWvn37rF+/ftmxxx5b53i5tJyr7wraDakvUxr6rpFl/71S/bBhw7Ju3bplVVVV2eqrr57tv//+2e9///ta6zX2/V2a999/P/vBD36QbbbZZtkKK6yQtW/fPhswYEB22GGHZf/7v/9ba90//vGP2U477ZR16dIl69SpU/blL385u/POO2uts7TXVf0efD4Hl/adY+7cudlRRx2V9enTJ+vSpUu29957Z2+88Uat/C7C/l/a973Pu/jii7OIqPWd7aWXXsp23XXXrGvXrlmPHj2yAw44IJsxY0a931/GjRuX9e/fP2vTpk2t93dpba++r/p7w0cffZStt9562frrr1/rfcuyLDv++OOz9u3bZ3/605/KvlZg2WooQ+bPn58NGDAgW3vttbOFCxdm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",
      "text/plain": [
       "<Figure size 1800x600 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化混淆矩阵\n",
    "fig, ax = plt.subplots(1, 3, figsize=(18, 6))\n",
    "\n",
    "# KNN模型混淆矩阵\n",
    "sns.heatmap(confusion_matrix(y_test, y_pred_knn), annot=True, fmt=\"d\", cmap=\"Blues\", ax=ax[0])\n",
    "ax[0].set_title(\"KNN Confusion Matrix\")\n",
    "\n",
    "# 决策树混淆矩阵\n",
    "sns.heatmap(confusion_matrix(y_test, y_pred_dt), annot=True, fmt=\"d\", cmap=\"Blues\", ax=ax[1])\n",
    "ax[1].set_title(\"Decision Tree Confusion Matrix\")\n",
    "\n",
    "# 随机森林混淆矩阵\n",
    "sns.heatmap(confusion_matrix(y_test, y_pred_rf), annot=True, fmt=\"d\", cmap=\"Blues\", ax=ax[2])\n",
    "ax[2].set_title(\"Random Forest Confusion Matrix\")\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a1f21f7-06ef-4805-8674-5de919c05c5d",
   "metadata": {},
   "outputs": [],
   "source": [
    "升级"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c9778c19-717b-4962-ab45-fa5f5681be13",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3e504018-de68-47a6-af3a-39e8e7f4337a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
